/**
 * 生成一个更浅的颜色
 *
 * @param {string} hex - 原始十六进制颜色代码（如 #4a90e2）。
 * @param {number} amount - 调整亮度的值，正数变浅，负数变深。
 * @returns {string} - 调整后的十六进制颜色代码。
 */
function lightenColor(hex, amount) {
  // 确保 hex 是有效的六位十六进制颜色
  if (!/^#([0-9A-F]{3}){1,2}$/i.test(hex)) {
    throw new Error('Invalid HEX color.');
  }

  // 去掉 #
  let color = hex.slice(1);

  // 如果是缩写形式 (#RGB)，扩展为长格式 (#RRGGBB)
  if (color.length === 3) {
    color = color
      .split('')
      .map((char) => char + char)
      .join('');
  }

  // 转换为 RGB 数字
  const num = parseInt(color, 16);
  const r = (num >> 16) + amount;
  const g = ((num >> 8) & 0x00ff) + amount;
  const b = (num & 0x0000ff) + amount;

  // 确保 RGB 值在 0-255 范围内
  const newR = Math.min(255, Math.max(0, r));
  const newG = Math.min(255, Math.max(0, g));
  const newB = Math.min(255, Math.max(0, b));

  // 转回十六进制格式
  return `#${((1 << 24) + (newR << 16) + (newG << 8) + newB).toString(16).slice(1).toUpperCase()}`;
}

/**
 * 判断传入的值是否为有效的原始十六进制颜色代码
 *
 * @param {string} hex - 需要判断的颜色值。
 * @returns {boolean} - 如果是有效的十六进制颜色代码返回 true，否则返回 false。
 */
function isValidHexColor(hex) {
  // 正则表达式匹配 #RGB 或 #RRGGBB 的十六进制颜色代码
  const regex = /^#([0-9A-F]{3}){1,2}$/i;
  return regex.test(hex); // 如果匹配，返回 true，否则返回 false
}

const ColorUtil = {
  lightenColor,
  isValidHexColor
};

export default ColorUtil;
